use crate::hsmap::map_func;
use crate::String_type::create_string;

mod String_type;
mod hsmap;
mod question_fun;

fn main() {
    // println!("Hello, world!");

    let v = vec![1,2,3];

    let mut v1 = Vec::new();

    v1.push(1);
    v1.push(1);
    v1.push(2);
    v1.push(1);

    println!("{:?}", v1);


    let third: &i32 = &v1[2];

    println!("{}",third);

    // 索引 vs get处理访问越界
    //  1.索引 panic 2.get 返回None


    // 不能再同一个作用域内同时拥有可变和不可变引用（所有权和借用规则） 例子：
    // let first = &v[0];
    // v.push(2);
    // println!("{}",first);
    // vec中的元素在内存中的摆放是连续的，一个挨着一个，所以在往vec内添加元素的时候，在内存中就可能没那么大的连续内存块了，它可能就会将
    // 这个内存重新分配一下，再重新找一个足够大的内存，来放置添加元素过后的vec，原来的那块内存就可能会重新释放，或者重新分配，在内存释放和
    // 重新分配之后，我们这个first变量，如果规则允许的话，&v[0]指向的原来的内存地址，那么程序运行过程就可能会出问题，所以规则是为了防止这
    // 样的情况发生

    match v1.get(2) {
        Some(third) => println!("The third element is {}",third),
        None => println!("There is no third element.")
    }

    // 遍历vec
    // for i in v1 {
    //     println!("{}",i);
    // }

    for i in &mut v1 {
        *i += 50;
    }

    for i in v1 {
        println!("{}",i);
    }

    // 使用enum来存储多种数据类型
    // 1.enum的变体可以附加不同类型的数据  2.enum的变体定义在同一个enum类型下
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Float(10.12),
        SpreadsheetCell::Text(String::from("blue"))
    ];

    // 使用枚举虽然能够兼容多种类型，但是这个需要提前知道类型，我们才可以使用enum来存储，对于不确定类型的可以使用trait来实现

    create_string();

    // 创建String的方法：
    // String::new();
    // String::from("abc");
    // "abc".to_string();   这种方法可用于实现Display trait的类型，包括字符串字面值

    let mut s = String::from("foo");
    s.push_str("123");
    println!("{}",s);

    let s1 = String::from("abd");
    let s2 = String::from("abd");
    let s3 = s1 + &s2;
    // 此时s1也相继失效了
    // 使用+连接字符串   1.标准库中的add方法使用泛型   2.只能把&str添加到String   3.解引用强制转换（deref coercion）

    // 下面怎么拼接字符串方法，不会获得所有权，后面仍然可以使用
    let s4 = format!("{}-{}-{}","s1",s2,s3);
    println!("{}",s4);
    // rust的字符串不支持像s4[2]这种索引取值

    let w = "abc";
    for s5 in s4.bytes() {
        println!("{}",s5);
    }
    let s6 = &w[0..2];
    println!("{}",s6);

    map_func();


}


enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}
